1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
| // SPDX-License-Identifier: MIT pragma solidity ^0.8.0;
interface IERC20 { // 获取合约地址 function getAddress() external view returns (address); // 获取代币发行总量 function totalSupply() external view returns (uint256); // 根据地址获取代币的余额 function balanceOf(address account) external view returns (uint256); // 代理可转移的代币数量 function allowance(address owner, address supender) external view returns (uint256);
// 转账 function transfer(address recipient, uint256 amount) external returns (bool); // 设置代理能转账的金额 function approve(address owner, address spender, uint256 amount) external returns (bool); // 转账 function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); }
// 代币实现 contract ERC20Basic is IERC20 { string public constant name = "X"; // 代币名称 string public constant symbol = "X"; // 代币简称 uint8 public constant decimals = 18;
mapping(address => uint256) balances; // 地址对应的余额数量 mapping(address => mapping(address => uint256)) allowedBalence; // 代理商能处理的代币数量
uint256 totalSupply_ = 10 ether; // 发行数量,ether指的是单位,类似吨,也可以使用8个0
constructor () { balances[msg.sender] = totalSupply_; // 将代币分发给创建者 }
// 获取合约地址 function getAddress() external override view returns (address){ return address(this); // 当前合约的地址 } // 获取代币发行总量 function totalSupply() external override view returns (uint256){ return totalSupply_; }
// 根据地址获取代币的余额 function balanceOf(address tokenOwner) public override view returns (uint256){ return balances[tokenOwner]; // 根据地址获取余额 }
// 转账 function transfer(address receiver, uint256 amount) public override returns (bool){ require(amount <= balances[msg.sender]); balances[msg.sender] = balances[msg.sender]-amount; balances[receiver] = balances[receiver]+amount; emit Transfer(msg.sender, receiver, amount); return true; }
// 设置代理能转账的金额 function approve(address owner, address delegate, uint256 amount) external override returns (bool){ allowedBalence[owner][delegate] = amount; emit Approval(owner, delegate, amount); return true; }
// 代理可转移的代币数量 function allowance(address owner, address delegate) external override view returns (uint256){ return allowedBalence[owner][delegate]; }
// 转账 function transferFrom(address owner, address buyer, uint256 amount) external override returns (bool){ require(amount <= balances[owner]); require(amount <= allowedBalence[owner][msg.sender]);
balances[owner] = balances[owner]-amount; allowedBalence[owner][buyer] = allowedBalence[owner][buyer]-amount; balances[buyer] = balances[buyer]+amount; emit Transfer(owner, buyer, amount); return true; } }
contract Swap {
IERC20 public token;
event Buy(uint256 amount); event Sell(uint256 amount); event Withdraw(address _addrss,uint256 _amount);
constructor(){ token = new ERC20Basic(); }
function buy()public payable { uint256 inAmount = msg.value; uint256 dexBalance = token.balanceOf(address(this)); require(inAmount > 0,'You need send some ether!'); require(inAmount <= dexBalance,'Not enough tokens in the reserve');
uint256 outAmount = inAmount * 20; token.transfer(msg.sender,outAmount); emit Sell(outAmount); }
function approve(uint256 amount) public returns(bool){ return token.approve(msg.sender,address(this),amount); } function sell(uint256 amount) public { /// 在这里只简单演示卖掉erc20代币,退回合约中的eth require(amount > 0,'You need to sell at least some tokens'); uint256 allowance = token.allowance(msg.sender,address(this)); require(amount <= allowance,'check the token allowance'); ///发送ERC20代币给合约 token.transferFrom(msg.sender,address(this),amount); uint256 withdrawAmount = address(this).balance; /// 退回eth payable(msg.sender).call{value: withdrawAmount}(""); ///触发事件 emit Withdraw(address(msg.sender),withdrawAmount); emit Sell(amount); }
function getDexBalance() public view returns(uint256){ return token.balanceOf(address(this)); }
function getOwnerBalance() public view returns(uint256){ return token.balanceOf(msg.sender); }
function getTotalSupply() public view returns(uint256){ return token.totalSupply(); }
function getAllowance() public view returns(uint256){ return token.allowance(msg.sender,address(this)); }
function getEthBalance() public view returns(uint256){ return address(this).balance ; } }
|